﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace inf_1007_devoir3
{
    public partial class gestionModele : Form
    {
        int positionNav = 0;
        //constructeur
        public gestionModele()
        {
            InitializeComponent();
        }

        public gestionModele(Modele modele)
        {
            InitializeComponent();
            remplirInterfaceModele(modele);
            remplirLstVehicule(modele);
            desactiverChampsModele();
        }
        //remplir les champs de l'interface
        public void remplirInterfaceModele(Modele modele)
        {
            txtMarque.Text = modele.getMarque();
            txtModele.Text = modele.getModele();
            txtAnnee.Text = modele.getAnnee().ToString();
            txtNbrPlaces.Text = modele.getNbrPlaces().ToString();
            txtNbrPortes.Text = modele.getNbrPortes().ToString();
            txtNbrCylindres.Text = modele.getNbrCylindres().ToString();
            txtTailleMoteur.Text = modele.getTailleMoteur().ToString();
            cboTraction.Text = modele.getTraction();
            txtConsommation.Text = modele.getConsommation().ToString();
            txtCout.Text = modele.getCoutLocation().ToString();
            if (modele.getTransmission() == "Automatique")
            {
                rdbAutomatique.Checked = true;
                rdbManuelle.Checked = false;
            }
            else
            {
                rdbAutomatique.Checked = false;
                rdbManuelle.Checked = true;
            }
            //manque option
        }
        //activation et desactivation des champs
        public void activerChampsModele()
        {
            txtMarque.ReadOnly = false;
            txtModele.ReadOnly = false;
            txtAnnee.ReadOnly = false;
            txtNbrPlaces.ReadOnly = false;
            txtNbrPortes.ReadOnly = false;
            txtNbrCylindres.ReadOnly = false;
            txtTailleMoteur.ReadOnly = false;
            cboTraction.Enabled = true;
            txtConsommation.ReadOnly = false;
            txtCout.ReadOnly = false;
            rdbAutomatique.Enabled = true;
            rdbManuelle.Enabled = true;
            
            btnPremier.Enabled = false;
            btnPrecedent.Enabled = false;
            btnSuivant.Enabled = false;
            btnDernier.Enabled = false;

            btnAjoutVehicule.Enabled = false;
            btnSelectionner.Enabled = false;

            btnRetour.Enabled = false;
        }

        public void desactiverChampsModele()
        {
            txtMarque.ReadOnly = true;
            txtModele.ReadOnly = true;
            txtAnnee.ReadOnly = true;
            txtNbrPlaces.ReadOnly = true;
            txtNbrPortes.ReadOnly = true;
            txtNbrCylindres.ReadOnly = true;
            txtTailleMoteur.ReadOnly = true;
            cboTraction.Enabled = false;
            txtConsommation.ReadOnly = true;
            txtCout.ReadOnly = true;
            rdbAutomatique.Enabled = false;
            rdbManuelle.Enabled = false;

            btnPremier.Enabled = true;
            btnPrecedent.Enabled = true;
            btnSuivant.Enabled = true;
            btnDernier.Enabled = true;

            btnAjoutVehicule.Enabled = true;
            btnSelectionner.Enabled = true;

            btnRetour.Enabled = true;
        }
        //vide le champs pour l'ajout
        public void viderInterfaceModele()
        {
            txtMarque.Text = "";
            txtModele.Text = "";
            txtAnnee.Text = "";
            txtNbrPlaces.Text = "";
            txtNbrPortes.Text = "";
            txtNbrCylindres.Text = "";
            txtTailleMoteur.Text = "";
            cboTraction.SelectedIndex = 0;
            txtConsommation.Text = "";
            txtCout.Text = "";
            rdbAutomatique.Checked = true;
            rdbManuelle.Checked = false;

            lstVehicule.Items.Clear();
        }
        //remplir la liste des véhicule pour un modèle
        public void remplirLstVehicule(Modele modele)
        {
            lstVehicule.Items.Clear();
            for (int i = 0; i < CtrlVehicule.getInstance().getVehicules().Count(); i++)
            {
                if (CtrlVehicule.getInstance().getVehicules()[i].getModele() == modele)
                {
                    string dispo = "";
                    ListViewItem itemVehicule = new ListViewItem();
                    itemVehicule.Text = CtrlVehicule.getInstance().getVehicules()[i].getCouleur();
                    itemVehicule.SubItems.Add(CtrlVehicule.getInstance().getVehicules()[i].getKilometrage().ToString());
                    if (CtrlVehicule.getInstance().getVehicules()[i].getDisponibilite() == true)
                    {
                        dispo = "Disponible";
                    }
                    else
                    {
                        dispo = "Non disponible";
                    }
                    itemVehicule.Tag = i;
                    itemVehicule.SubItems.Add(dispo);
                    lstVehicule.Items.Add(itemVehicule);
                }
            }
        }
        //navigation <<,<,>,>>
        private void btnPremier_Click(object sender, EventArgs e)
        {
            positionNav = 0;
            Modele tempMo = CtrlModele.getInstance().getModeles()[0];
            remplirInterfaceModele(tempMo);
            remplirLstVehicule(tempMo);
        }

        private void btnPrecedent_Click(object sender, EventArgs e)
        {
            positionNav = positionNav - 1;
            if (positionNav>=0)
            {
                Modele tempMo = CtrlModele.getInstance().getModeles()[positionNav];
                remplirInterfaceModele(tempMo);
                remplirLstVehicule(tempMo);
            }
            else
            {
                positionNav = positionNav + 1;
            }
        }

        private void btnSuivant_Click(object sender, EventArgs e)
        {
            positionNav = positionNav + 1;
            if (positionNav<=(CtrlModele.getInstance().getModeles().Count()-1))
            {
                Modele tempMo = CtrlModele.getInstance().getModeles()[positionNav];
                remplirInterfaceModele(tempMo);
                remplirLstVehicule(tempMo);
            }
            else
            {
                positionNav = positionNav - 1;
            }

        }

        private void btnDernier_Click(object sender, EventArgs e)
        {
            positionNav = (CtrlModele.getInstance().getModeles().Count() - 1);
            Modele tempMo = CtrlModele.getInstance().getModeles()[positionNav];
            remplirInterfaceModele(tempMo);
            remplirLstVehicule(tempMo);
        }
        //evenement sur des boutons
        private void btnAjouterModele_Click(object sender, EventArgs e)
        {
            if (btnAjouterModele.Text == "Nouveau modèle")
            {
                btnAjouterModele.Text = "Enregistrer";
                viderInterfaceModele();
                activerChampsModele();

            }
            else
            {
                string tranmission ="";
                if (rdbAutomatique.Checked==true)
                {
                tranmission="Automatique";
                }
                else
                {
                tranmission="Manuelle";
                }

                remplacerVirgule(txtCout);
                remplacerVirgule(txtConsommation);
                remplacerVirgule(txtTailleMoteur);

                if (validationModele())
                { 
                    CtrlModele.getInstance().ajouterModele(txtMarque.Text, txtModele.Text,int.Parse(txtAnnee.Text), int.Parse(txtNbrPlaces.Text), int.Parse(txtNbrPortes.Text), int.Parse(txtNbrCylindres.Text), double.Parse(txtTailleMoteur.Text), tranmission, cboTraction.Text, double.Parse(txtConsommation.Text), double.Parse(txtCout.Text), null);
                
                    btnAjouterModele.Text = "Nouveau modèle";
                    desactiverChampsModele();
                }
            }
        }

        private void btnSelectionner_Click(object sender, EventArgs e)
        {
            if (lstVehicule.SelectedIndices.Count > 0)
            {
                string str = lstVehicule.SelectedItems[0].Tag.ToString();
                CtrlVehicule.getInstance().afficherListeVehicule(CtrlVehicule.getInstance().getVehicules()[int.Parse(str)], int.Parse(str), positionNav);

                remplirLstVehicule(CtrlModele.getInstance().getModeles()[positionNav]);
            }
        }

        private void btnAjoutVehicule_Click(object sender, EventArgs e)
        {
            CtrlVehicule.getInstance().afficherListeVehicule(positionNav);
        }
        
        private void btnRetour_Click(object sender, EventArgs e)
        {
            this.Close();
        }
        //remplace les points par des virgules pour les doubles
        public void remplacerVirgule(TextBox txtBox)
        {
            txtBox.Text = txtBox.Text.Replace(".", ",");

            int count = txtBox.Text.Split(',').Length - 1;
            if (count==0)
            {
                txtBox.Text = txtBox.Text + ",0";
            }

        }
        //validation pour les doubles
        public bool valideDouble(TextBox txt, string msg1, string msg2)
        {
            bool valVal = true;
            double dTemp;

            if (txt.Text == "")//regarde si il y a du contenu
            {
                errorModele.SetError(txt, msg1);
                valVal = false;
            }

            if (double.TryParse(txt.Text, out dTemp) == false)//regarde si le contenu est un double
            {
                errorModele.SetError(txt, msg2);
                valVal = false;
            }
            return valVal;
        }
        //validation pour les entiers
        public bool valideInt(TextBox txt, string msg1, string msg2)
        {
            bool valVal = true;
            int iTemp;

            if (txt.Text == "")//regarde si il y a du contenu
            {
                errorModele.SetError(txt, msg1);
                valVal = false;
            }

            if (int.TryParse(txt.Text, out iTemp) == false)//regarde si le contenu est un entier
            {
                errorModele.SetError(txt, msg2);
                valVal = false;
            }
            return valVal;
        }
        //validation pour string
        public bool valideStr(TextBox txt, string msg)
        {
            bool valVal = true;

            if (txt.Text == "")//regarde si il y a du contenu
            {
                errorModele.SetError(txt, msg);
                valVal = false;
            }
            return valVal;
        }
        //appel des fonctions de validation + message d'erreur
        public bool validationModele()
        {
            bool valValidation = true;
            errorModele.Clear();

            if(valideStr(txtMarque, "Entrez une marque.")==false)
                valValidation = false;
            
            if (valideStr(txtModele, "Entrez un modèle.")==false)
                valValidation = false;
            
            if(valideInt(txtAnnee, "Entrez une année.", "Entrez un nombre entier numérique.")== false)
                valValidation = false;

            if(valideInt(txtNbrPlaces, "Entrez un nombre de places.", "Entrez un nombre entier numérique.")==false)
                valValidation = false;

            if(valideInt(txtNbrPortes, "Entrez un nombre de portes.", "Entrez un nombre entier numérique.")==false)
                valValidation = false;

            if(valideInt(txtNbrCylindres, "Entrez un nombre de cylindres.", "Entrez un nombre entier numérique.")== false)
                valValidation = false;

            if(valideDouble(txtTailleMoteur, "Entrez une taille de moteur.", "Entrez un nombre.")== false)
                valValidation = false;

            if(valideDouble(txtConsommation, "Entrez une consommation.", "Entrez un nombre.")== false)
                valValidation = false;
            
            if(valideDouble(txtCout, "Entrez un coût.", "Entrez un nombre.")== false)
                valValidation = false;
           
            return valValidation;
        }
    }
}
